package models;

import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.Page;
import play.data.validation.Constraints;
import play.db.ebean.Model;

/**
 * Modele de la classe QcmNiveauquestion. Cette classe enregistre le nombre de
 * point positif et negatif que peut rapporter une question de niveau
 * NiveauQuestion pour un Qcm donné.
 * 
 * @author ProjetSI-QCM
 * 
 */
@SuppressWarnings("serial")
@Entity
public class QcmNiveauquestion extends Model {

    /**
     * Identifiant de QcmNiveauquestion.
     */
    @Id
    private Long idQcmNiveauQuestion;

    /**
     * Référence vers le Qcm.
     */
    @ManyToOne
    private Qcm qcm;

    /**
     * Référence vers le NiveauQuestion.
     */
    @ManyToOne
    private NiveauQuestion niveauQuestion;

    /**
     * Nombre de Points Positifs attribués pour une bonne réponse (>0).
     */
    @Constraints.Required
    private double pointPositif;

    /**
     * Nombre de Points Négatifs attribués pour une mauvaise réponse (>0).
     */
    @Constraints.Required
    private double pointNegatif;

    /**
     * Finder de la classe QcmNiveauquestion.
     */
    private static Finder<Long, QcmNiveauquestion> find = 
            new Finder<Long, QcmNiveauquestion>(
            Long.class, QcmNiveauquestion.class);

    /**
     * Permet de retrouver un QcmNiveauquestion en fonction de son id.
     * 
     * @param id
     *            identifiant du QcmNiveauquestion
     * @return QcmNiveauquestion L'objet recherché
     */
    public static QcmNiveauquestion findById(final Long id) {
        return Ebean.find(QcmNiveauquestion.class, id);
    }

    /**
     * Recupere l'ensemble des QcmNiveauquestion d'un qcm.
     * 
     * @param qcm
     *            le QCM dont on veut recuperer le niveau des questions
     * @return List<QcmNiveauquestion> La liste des QcmNiveauquestion
     */
    public static List<QcmNiveauquestion> findByQcm(final Qcm qcm) {
        return find.where().eq("qcm", qcm).findList();
    }
    
    /**
     * Recupere les nq pour un NiveauQuestion.
     * 
     * @param nq
     *            le NiveauQuestion dont 
     *            on veut recuperer tous les niveaux des questions
     * @return List<QcmNiveauquestion> La liste des QcmNiveauquestion
     */
    public static List<QcmNiveauquestion> findByQcmNiveauQuestion(
    		final NiveauQuestion nq) {
        return find.where().eq("niveauQuestion", nq).findList();
    }

    /**
     * Recupere tous les QcmNiveauquestion de la Base de Données.
     * 
     * @return List<QcmNiveauquestion> La liste
     */
    public static List<QcmNiveauquestion> findAll() {
        return find.all();
    }

    /**
     * Permet de sauvegarder un QcmNiveauquestion en base de Données.
     * 
     * @param qcmNivQuest
     *            l'objet à sauvegarder
     */
    public static void create(final QcmNiveauquestion qcmNivQuest) {
        qcmNivQuest.save();
    }

    /**
     * Permet de modifier un QcmNiveauquestion en base de données.
     * 
     * @param qcmNivQuest
     *            l'objet à modifier
     */
    public static void update(final QcmNiveauquestion qcmNivQuest) {
        qcmNivQuest.update();
    }

    /**
     * Permet de supprimer un QcmNiveauquestion en base de données.
     * 
     * @param id
     *            L'identifiant de l'objet à supprimer
     */
    public static void delete(final Long id) {
        find.ref(id).delete();
    }

    /**
     * Retourne une Page de QcmNiveauquestion.
     * 
     * @param page
     *            Page à afficher
     * @param pageSize
     *            Nombre d'objets par page
     * @param sortBy
     *            Propriété utilisée pour le tri
     * @param order
     *            Sens du tri (asc ou desc)
     * @param filter
     *            Filtre appliqué sur le nom de la colonne
     * @return Page<QcmNiveauquestion> la page
     */
    public static Page<QcmNiveauquestion> page(final int page,
            final int pageSize, final String sortBy, final String order,
            final String filter) {
        return find.where().ilike("idQcmNiveauQuestion", "%" + filter + "%")
                .orderBy(sortBy + " " + order).fetch("qcm")
                .fetch("niveauQuestion").findPagingList(pageSize)
                .setFetchAhead(false).getPage(page);
    }

	/**
	 * @return the idQcmNiveauQuestion
	 */
	public final Long getIdQcmNiveauQuestion() {
		return idQcmNiveauQuestion;
	}

	/**
	 * @param id the idQcmNiveauQuestion to set
	 */
	public final void setIdQcmNiveauQuestion(final Long id) {
		this.idQcmNiveauQuestion = id;
	}

	/**
	 * @return the qcm
	 */
	public final Qcm getQcm() {
		return qcm;
	}

	/**
	 * @param q the qcm to set
	 */
	public final void setQcm(final Qcm q) {
		this.qcm = q;
	}

	/**
	 * @return the niveauQuestion
	 */
	public final NiveauQuestion getNiveauQuestion() {
		return niveauQuestion;
	}

	/**
	 * @param nq the niveauQuestion to set
	 */
	public final void setNiveauQuestion(final NiveauQuestion nq) {
		this.niveauQuestion = nq;
	}

	/**
	 * @return the pointPositif
	 */
	public final double getPointPositif() {
		return pointPositif;
	}

	/**
	 * @param pp the pointPositif to set
	 */
	public final void setPointPositif(final double pp) {
		this.pointPositif = pp;
	}

	/**
	 * @return the pointNegatif
	 */
	public final double getPointNegatif() {
		return pointNegatif;
	}

	/**
	 * @param pn the pointNegatif to set
	 */
	public final void setPointNegatif(final double pn) {
		this.pointNegatif = pn;
	}


}
